﻿
using System;
using System.Collections.Generic;

////---------------------------------------------- 类型参数的约束（C# 编程指南）
////https://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters
//public class Employee
//{
//    public Employee(string name, int id)
//    {
//        this.Name = name; this.ID = id;
//    }
//    public string Name { get; set; }
//    public int ID { get; set; }
//}

//public class GenericList<T> where T : Employee
//{
//    private class Node
//    {
//        public Node(T t)
//        {
//            this.Next = null;
//            this.Data = t;
//        }

//        public Node Next { get; set; }
//        public T Data { get; set; }
//    }

//    private Node head;

//    public void AddHead(T t)
//    {
//        Node n = new Node(t) { Next = head };
//        head = n;
//    }

//    public IEnumerator<T> GetEnumerator()
//    {
//        Node current = head;

//        while (current != null)
//        {
//            yield return current.Data;
//            current = current.Next;
//        }
//    }

//    public T FindFirstOccurrence(string s)
//    {
//        Node current = head;
//        T t = null;

//        while (current != null)
//        {
//            //The constraint enables access to the Name property.
//            if (current.Data.Name == s)
//            {
//                t = current.Data;
//                break;
//            }
//            else
//            {
//                current = current.Next;
//            }
//        }
//        return t;
//    }
//}


//---------------------------------------------- 委托约束
//// 合并相同类型的委托
//public class program
//{
//    public static class class_TypeSafeCombine
//    {

//        // 合并相同类型的委托
//        public static T TypeSafeCombine<T>(this T source, T target)
//            where T : System.Delegate
//        {
//            return Delegate.Combine(source, target) as T;
//        }
//    }

//    public static string getName1() {
//        return "1";
//    }
//    public static string getName2()
//    {
//        return "2";
//    }
//    public static void Main(string[] args)
//    {

//        Console.OutputEncoding = System.Text.Encoding.Unicode;

//        Func<string> func1 = getName1;
//        Func<string> func2 = getName2;

//        //Func<string> func3= func1.TypeSafeCombine(func2);


//        Console.ReadKey();
//    }


//}

//---------------------------------------------- 泛型和数组（C# 编程指南）
//class Program18
//{
//    static void Main()
//    {
//        int[] arr = { 0, 1, 2, 3, 4 };

        
//        List<int> list = new List<int>();

//        for (int x = 5; x < 10; x++)
//        {
//            list.Add(x);
//        }

//        ProcessItems<int>(arr);
//        ProcessItems<int>(list);
//        Console.ReadKey();
//    }

//    static void ProcessItems<T>(IList<T> coll)
//    {
//        // IsReadOnly returns True for the array and False for the List.
//        System.Console.WriteLine
//            ("IsReadOnly returns {0} for this collection.",
//            coll.IsReadOnly);

//        // The following statement causes a run-time exception for the
//        // array, but not for the List.
//        //coll.RemoveAt(4);

//        foreach (T item in coll)
//        {
//            System.Console.Write(item?.ToString() + " ");
//        }
//        System.Console.WriteLine();
//    }
//}